Negative Zahlen

 

Wenn wir den Befehl H des Debug Programms ausprobiert haben, könnten wir etwas sonderbares entdecken. Wenn wir 3 von 2 subtrachieren, erhalten wir nicht –1, sondern FFFFh. Probieren wir noch einmal diese Werte aus. Wenn wir FFFFh zum Dezimalsystem umwandeln, bekommen wir 65535. Was hat das mit –1 zu tun? Der Befehl H 5 FFFF ergibt 4 und 6, also FFFFh benehmt sich als –1. Versuchen wir die Addition dieser zwei Werten auf Papier auszuführen:

0005h +

FFFFh

-------

10004h

Wenn wir den, als fünfte Ziffer bekommene 1-er nicht in Rücksicht nehmen (genau wie es das Debug Programm macht), erhalten wir das richtige Ergebnis. FFFFh benehmt sich also als –1, wenn wir den "Überlauf" nicht in Rücksicht nehmen. Wir nennen es Überlauf (overflow), weil die Zahl eigentlich fünf Ziffern hat, das Debug behaltet aber nur vier davon.

Ist das jetzt ein Überlauf-Fehler oder ist das Ergebnis richtig? Eigentlich beides ist Recht. Ist das aber kein Wiederspruch? Eigentlich nicht, weil wir diese Zahlen aus Zwei verschiedene Sichtpunkte betrachten können. Nehmen wir an, dass FFFFh ist gleich 65535. Das ist eine positive Zahl, und zugleich die grösseste Zahl was wir mit vier hexa Ziffern ausdrücken können. Wir sagen, dass FFFFh eine vorzeichenlose Zahl ist. In diesem Fall, wenn wir zu FFFFh 5 addieren, erhalten wir 10004h, keine andere Antwort ist richtig. Im Fall den vorzeichenlosen Zahlen tritt also ein Überlauf-Fehler auf.

Von dem anderen Sichtpunkt können wir FFFFh als negative Zahl interpretieren, wie das Debug es getan hat, wenn wir den H Befehl benützt haben. FFFFh benehmt sich als –1, wenn wir den Überlauf nicht in Rücksicht nehmen. Eigentlich benehmen sich alle Zahlen zwischen 8000h und FFFFh als negative Zahlen. Im Fall der Zahlen mit Vorzeichen ist der Überlauf kein Fehler. Der Mikroprozessor kann die Zahlen als vorzeichenlose oder als Zahlen mit Vorzeichen behandeln, wir können wählen.

Schauen wir uns die Form der negativen Zahlen an:

-positive Zahlen:

0000h        0000 0000 0000 0000b

...

...

7FFFh       0111 1111 1111 1111b

-negative Zahlen:

8000h       1000 0000 0000 0000b

...

...

FFFFh       1111 1111 1111 1111b

Wir können entdecken, dass im Fall der positven Zahlen ist das höchstwertige Bit (15ste Bit) immer 0, weil im Fall der negativen Zahlen ist es immer 1. Dieser Unterschied berichtet den Mikroprozessor darüber, weder eine Zahl negativ oder positv ist: er schaut das 15ste Bit (das Vorzeichenbit) an.

 

Diese negative Zahlen sind die sogenannte Zweier-Komplemente der positiven Zahlen (sie komplementieren die gegebene positive Zahl zu 10000h). Der Rechner stellt die negative Zahlen in (Zweier-)Komplementdarstellung dar. Wir können die Umwandlung zwischen den Kods der positiven und negativen Zahlen in zwei verschiedenen Arten durchführen: entweder durch Subtraktion von 10000h, oder formell, in zwei Schritte: wir invenrtieren jede Ziffer der binären Zahl (statt 0 schreiben wir 1, und statt 1 schreiben wir 0), dann addieren wir 1 dazu.

Zum Beispiel: wir bekommen volgenderweise die Komplementdarstellung von -3C8h:

3C8h = 0000 0011 1100 1000b

im erster Schritt erhalten wir 1111 1100 0011 0111 ,

dann

1111 1100 0011 0111+

                             1

     ---------------------------------

-3C8h =   1111 1100 0011 1000b = FC38h

 

Wir können das Ergebnis mit der Hilfe von Debug überprüfen, wenn wir 3C8 von 0 subtrachieren. Ebenso erhalten wir die entsprechende positive Zahl vom Komplementdarstellung einer negativen Zahl.